#include "stm32f10x.h"                  // Device header
#include "Delay.h"
uint16_t CountSensor_Count;


//配置时钟RCC->
//配置GPIO->
//配置AFIO,选择使用的GPIO连接到后面的EXTI->
//配置EXTI,选择边沿触发方式/选择触发响应方式->
//配置NVIC,选择合适的优势级->
//外部中断信号进入MCU->
//跳转到中断函数执行(编写中断函数


//1.把涉及外设的时钟都打开
void CountSensor_Init(void)
{
	// 开启GPIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	// 开启AFIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	// EXTIh和NVIC的时钟一直是打开的,无需配置
	
//2.配置GPIO
	GPIO_InitTypeDef GPIO_InitStruture;
	GPIO_InitStruture.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStruture.GPIO_Pin = GPIO_Pin_14;
	GPIO_InitStruture.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStruture);
//3.配置AFIO(外部引脚中断选择配置)-------AFIO可以理解成是"多路开关"
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
//4.配置EXTI
	EXTI_InitTypeDef EXTI_InitStruture;
	EXTI_InitStruture.EXTI_Line = EXTI_Line14;
	EXTI_InitStruture.EXTI_LineCmd = ENABLE;
	EXTI_InitStruture.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStruture.EXTI_Trigger = EXTI_Trigger_Rising;
	EXTI_Init(&EXTI_InitStruture);
//5.配置NVIC
	/*中断分组----分组方式整个芯片只能用一种,
	  也就是说整个工程里只需执行一次,最好是放在main函数里面
	  如果像现在这样放在模块里面,那要确保每个模块的分组都是同一个*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
}

//6.编写中断函数
	/*在STM32里面,中断函数的名字都是固定的
	  每个中断通道都对应着一个中断函数
	  中断函数的名字可以参考一下启动文件
	  IRQHandler名字结尾的函数就是中断函数
	  中断函数都是两个void*/ 
void EXTI15_10_IRQHandler(void)
{
	//1.先进行中断标志的判断,确保是我们想要的中断源触发的这个函数---(因为这个函数是10-15Lines)
	if (EXTI_GetITStatus(EXTI_Line14) == SET)	 // 看一下EXTI14的中断标准位是不是 为1
												 // 这样做也可以消除一些毛刺信号, 类似的, 对于毛刺信号, 也采取软件延时的方式, 或者硬件滤波
	{
		if (EXTI_GetITStatus(EXTI_Line14) == SET)
		{
			Delay_ms(10);		// 注意中断函数里不要加过长的延时, 以免影响主程序的运行
			CountSensor_Count++;
		}
	}
	EXTI_ClearITPendingBit(EXTI_Line14);     // 一定要清除中断标志位,否则程序出不来了
}

uint16_t CountSensor_Count_Get(void)
{
	return CountSensor_Count;
}
